10 REM ************************* 20 REM PROGRAM : RUNFILE 1.0 30 REM AUTHOR : DAVID DARUS 40 REM DATE : 6/15/87 50 REM UPDATE : 7/30/87 60 REM COMPUTER: C64 70 REM ************************* 80 REM COMMAND FILE=1 SEQ FILE=2 REL FILE=3 90 REM SET UP VARIABLES 98 DN=8 100 DEF FNH(A)=INT(A/256):DEF FNL(A)=A-(RH*256) 110 PRINT"[147][154]"CHR$(8)CHR$(14) 140 X=0:Y=0:SW=0:C=0:T=0:T1=0:NC=0:HC=0:CC=0:EC=0:A=0:L=0:EN=0:TR=0:SC=0:NF=0 150 FC=0:ND=0:FL=0:TX=0:TY=0:OX=0:OY=0:NM=0:AL=0:KY=0:SP=0:VN=0:TL=0:PL=0:CT=0 160 EF=0:MR=0:NL=0:RN=0:NR=0:OF=0 165 F1=133:F3=134:F5=135:F7=136:F2=137:F4=138:F6=139:F8=140 170 RL=0:RH=0:RS=0:RE=0:RM=0:IP=0:KF=0:KL=0:KP=0:RP=0:R$="":R1$="":KY$="" 180 CM$="":SP$="":A$="":AN$="":ER$="":DN$="":SS$="":XP$="":YP$="" 190 FOR T=1 TO 80:XP$=XP$+"":YP$=YP$+"":SP$=SP$+" ":UL$=UL$+"[164]":NEXT 200 SS$=CHR$(160):PD$="" 210 C=1:HC=2:CC=15:NC=6:NS=6:EC=8:OF=0 220 NL=22:VN=0:RN=0 230 SW=40:MR=1000:CT=0:POKE 53280,0:POKE 53281,0:POKE 808,234:GOTO 280 240 REM SW=40:MR=2000:CT=1:SLOW:REM TRAP 21000 250 IF PEEK(215)=128 THEN SW=80:(null)% 270 (null)0,1:(null)1,1:(null)4,1:(null)6,1:(null)5,15 272 (null)1,CHR$(133):(null)3,CHR$(134):(null)5,CHR$(135):(null)7,CHR$(136) 274 (null)2,CHR$(137):(null)4,CHR$(138):(null)6,CHR$(139):(null)8,CHR$(140) 280 DIMCR$(16),CX(NC),CY(NC),CM$(NC),TX$(18),FL$(NL),SX(NS),SY(NS),SM$(NS) 290 MF=30:A=MF+1:DIM FX(A),FY(A),FL(A),FT(A),FT$(A),FQ(A),FO(A) 300 DIM IX(MR),RD$(MR),SI(MR) 310 FORT=1TO16:CR$(T)=MID$("[144][159][156][158][129][149][150][151][152][153][154][155]",T,1):NEXT 320 CM$="[195][207][205][205][193][206][196][211]:[154] [195]LOSE [197]DIT [206]EW [207]PEN [213]TILS E[216]IT" 330 FORT=1 TO NC:READ CY(T),CX(T),CM$(T):NEXT 340 DATA 23,10,"[195]LOSE",23,16,"[197]DIT",23,21,"[206]EW",23,25,"[207]PEN",23,30,"[213]TILS" 350 DATA 23,36,"E[216]IT" 352 SM$="[213][212][201][204][211]:[154] [196]IR [196]OS [196]RIVE#08 [208]RINT [211]EQ [213]SR" 353 FOR T=1 TO NS:READ SY(T),SX(T),SM$(T):NEXT 354 DATA 23,7,"[196]IR",23,11,"[196]OS",23,15,"[196]RIVE#08",23,24,"[208]RINT",23,30,"[211]EQ" 355 DATA 23,34,"[213]SR" 360 FOR T=1 TO 18:READ TX$(T):NEXT 370 DATA "[210]UN [198]ILE 1.0","[196]ATABASE:","[204]EN=","[212]YPE:","[193]LPHA","[203]EY","[206]UM" 380 DATA "[211]PECIAL","[211]EARCHING FOR FIELD","[198]ILE:","[212]OTAL=" 390 DATA "[197]STIMATED # OF RECORDS","[204]OADING DATABASE PARAMETERS" 392 DATA " " 394 DATA "[211]ELECT FIELDS IN DESIRED EXPORT ORDER " 396 DATA "[211]ORT (Y/N)","[210]EPLACE RECORD (Y/N)","#RECS" 400 REM SET UP SCREEN 410 PRINT"[147]":X=0:Y=22:GOSUB2210 420 PRINTCR$(EC);:FOR T=1 TO SW:PRINT"[192]";:NEXT:X=0:GOSUB2210:PRINTTX$(1); 430 X=0:Y=23:GOSUB2210:PRINTCM$; 440 REM GET COMMANDS 450 C=1:GOSUB 5110 460 X=CX(C):Y=CY(C):GOSUB2210:PRINT""CR$(HC);CM$(C);"[146]"; 470 GETA$:IFA$=""THEN470 480 X=CX(C):Y=CY(C):GOSUB2210:PRINTCR$(CC);CM$(C); 490 IFA$=CHR$(13)THEN660 500 IFA$=""THEN600 510 IFA$="[157]"THEN630 520 IFA$="C"THEN710 530 IFA$="E"THEN810 540 IFA$="N"THEN1110 550 IFA$="O"THEN1210 560 IFA$="U"THEN1610 570 IFA$="X"THEN1710 580 GOTO460 590 REM CURSOR RIGHT 600 C=C+1:IFC>NCTHENC=1 610 GOTO460 620 REM CURSOR LEFT 630 C=C-1:IFC<1THENC=NC 640 GOTO460 650 REM RETURN 660 ON C GOTO 710,810,1110,1210,1610,1710:GOTO470 700 REM CLOSE DATABASE 710 IF OF=0 THEN 450 715 OPEN 1,DN,15,"I":PRINT#1,"S:\\TEMP.I":CLOSE1 720 OF=0:OPEN 2,DN,2,"\\TEMP.I,U,W":NR=IX(0) 730 RH=FNH(NR):RL=FNL(NR):PRINT#2,"INDX";CHR$(VN);CHR$(RL);CHR$(RH); 740 IF NR=0 THEN 760 750 FOR T=1 TO NR:RH=FNH(IX(T)):RL=FNL(IX(T)):PRINT#2,CHR$(RL);CHR$(RH);:NEXT 760 CLOSE2 770 OPEN1,DN,15,"S:"+DN$+"BI":PRINT#1,"R:"+DN$+"BI="+DN$+".I" 780 PRINT#1,"R:"+DN$+".I=\\TEMP.I":CLOSE1 785 FOR T=1 TO NL:FL$(T)="":NEXT 790 GOTO 410 800 REM EDIT DATABASE 810 IF OF=0 THEN 1030 820 PD$=UL$:FC=1:ND=0:PL=TL 830 OPEN1,DN,15:OPEN3,DN,3,DN$+".D" 840 AL=0:KY=0:NM=0:SP=0:GOSUB 5110:X=0:Y=24:GOSUB2210:PRINT TX$(4); 850 IF FT(FC) AND 1 THEN X=6:Y=24:GOSUB 2210:PRINT""+TX$(5)+"[146]";:AL=1 860 IF FT(FC) AND 2 THEN X=12:Y=24:GOSUB 2210:PRINT""+TX$(6)+"[146]";:KY=1 870 IF FT(FC) AND 4 THEN X=16:Y=24:GOSUB 2210:PRINT""+TX$(7)+"[146]";:NM=1 880 IF FT(FC) AND 8 THEN X=20:Y=24:GOSUB 2210:PRINT""+TX$(8)+"[146]";:SP=1 885 X=SW-11:Y=24:GOSUB 2210:PRINT TX$(18);NR; 890 X=FX(FC):Y=FY(FC):L=FL(FC):AN$=FT$(FC) 900 PRINT CR$(EC); 910 GOSUB 3430:T=FL(FC)-LEN(AN$):FT$(FC)=AN$+LEFT$(PD$,T) 920 IF A$=CHR$(13) AND FC=NF THEN 840 930 IF A$="" OR A$=CHR$(13) THEN FC=FC+1:IF FC>NF THEN FC=1 940 IF A$="[145]" THEN FC=FC-1:IF FC<1 THEN FC=NF 950 IF CT=1 AND ASC(A$+CHR$(0))=27 THEN A$="" 960 IF A$="" THEN 1020 970 IF A$=CHR$(F1) THEN GOSUB 5310:FC=1:REM FIND REC 975 IF A$=CHR$(F2) THEN GOSUB 2110:FC=1:REM WRITE REC 980 IF A$=CHR$(F3) THEN KF=1:GOSUB 1855:FC=1:REM FIRST REC 985 IF A$=CHR$(F4) THEN KF=IX(0):GOSUB 1855:FC=1:REM LAST REC 990 IF A$=CHR$(F5) THEN GOSUB 1950:FC=1:REM READ NEXT 995 IF A$=CHR$(F6) THEN GOSUB 1850:FC=1:REM READ PREV 1000 IF A$=CHR$(F7) THEN GOSUB 4010:FC=1:REM CLEAR FORM FIELDS 1005 IF A$=CHR$(F8) THEN GOSUB 4060:FC=1:REM PRINT FORM FIELDS 1010 GOTO 840 1020 CLOSE3:CLOSE1 1030 GOSUB1696:GOTO430 1100 REM NEW DATABASE 1110 IF OF=1 THEN 450 1120 X=0:Y=24:GOSUB2210:PRINT TX$(2);:L=14:X=9:GOSUB 2320 1130 IF A$="" THEN DN$="":GOTO 410 1140 IF AN$="" THEN 1120 1150 OPEN 2,DN,2,AN$+".F,U,R":GOSUB 5140:CLOSE2 1160 IF EN=0 THEN 1110 1170 IF EN<>62 THEN GOSUB 5060:GOTO 410 1180 NF=22:FOR T=1 TO NF:FX(T)=0:FY(T)=T-1:FL(T)=SW-1:FT$(T)=LEFT$(SP$,SW-2)+SS$ 1190 X=FX(T):Y=FY(T):GOSUB2210:PRINT FT$(T); 1195 FT(T)=0:NEXT:DN$=AN$:GOSUB 2790:DN$="":GOTO 410 1200 REM OPEN DATABASE 1210 IF OF=1 THEN 1500 1220 GOSUB 5110 1225 X=0:Y=24:GOSUB2210:PRINT TX$(2);:L=14:X=9:GOSUB 2320:IF A$="" THEN 1500 1230 IF AN$="" THEN 1220 1240 OPEN 2,DN,2,AN$+".F,U,R":GOSUB 5140:CLOSE2:IF EN<>0 THEN 1220 1250 X=0:Y=24:GOSUB2210:PRINT TX$(13); 1260 TL=0:GOSUB 3310:IF EF=-1 THEN 1220 1270 DN$=AN$:OPEN 2,DN,2,DN$+".I,U,R":GOSUB 5140:CLOSE2 1280 IF EN=0 THEN 1380 1290 IF EN<>62 THEN GOSUB 5060:GOTO 410 1300 REM CREATE DATABASE 1310 GOSUB5110:X=0:Y=24:GOSUB2210:PRINT TX$(12);:L=4:X=23:GOSUB2320 1320 RN=VAL(AN$):IF RN=0 THEN 1310 1330 IF RN>MR THEN RN=MR 1340 OPEN 2,DN,2,DN$+".I,U,W":PRINT#2,"INDX";CHR$(VN);CHR$(0);CHR$(0);:CLOSE2 1350 OPEN1,DN,15:OPEN3,DN,3,DN$+".D,L,"+CHR$(TL):RH=FNH(RN):RL=FNL(RN) 1360 RP=1:GOSUB5010:PRINT#3,CHR$(255);:GOSUB 5010:CLOSE3:CLOSE1:GOSUB 5140 1370 REM READ IN DATABASE INDEX,PARMS 1380 OF=1:X=SW-22:Y=22:GOSUB2210:PRINTTX$(10);DN$;:T1=1 1390 FOR T=1 TO NL:X=0:Y=T-1:GOSUB 2210 1400 IF CT=0 THEN PRINT FT$(T); 1410 IF CT=1 THEN PRINT LEFT$(FT$(T),SW-1); 1420 NEXT:FOR T=1 TO NF:T1=T1+FL(T):IF(FT(T)AND2)<>0 THEN KL=FL(T):KP=T1-KL:K1=T 1430 FT$(T)=LEFT$(UL$,FL(T)):NEXT:TL=T1-1 1440 OPEN 2,DN,2,DN$+".I,U,R" 1450 GET#2,A$,A$,A$,A$:GET#2,A$:VN=ASC(A$+CHR$(0)) 1460 GET#2,A$,B$:NR=ASC(A$+CHR$(0))+(ASC(B$+CHR$(0))*256):IX(0)=NR 1470 IF NR=0 THEN 1490 1480 FOR T=1 TO NR:GET#2,A$,B$:IX(T)=ASC(A$+CHR$(0))+(ASC(B$+CHR$(0))*256):NEXT 1490 CLOSE2 1500 GOTO450 1600 REM UTILS DATABASE 1610 GOSUB 4210:GOTO 430 1612 REM SELECT FIELDS 1615 IF OF=0 THEN RETURN 1620 PD$=SP$:FC=1:SO=1:FOR T=1 TO NF:FQ(T)=0:FO(T)=0:NEXT 1622 IF FR=2 THEN X=0:Y=23:GOSUB 2210:PRINT"[211]ELECT FIELD TO SEARCH ON ";:GOTO 1630 1625 X=0:Y=23:GOSUB 2210:PRINT TX$(15); 1630 AN$=FT$(FC):L=FL(FC):X=FX(FC):Y=FY(FC) 1632 IF FR=0 OR FR=2 THEN 1638 1633 GET A$:IF A$="" THEN 1633 1634 IF CT=1 AND ASC(A$+CHR$(0))=27 THEN A$="" 1635 IF A$="" THEN RETURN 1636 GOTO 1633 1638 PRINTCR$(EC);:GOSUB5200:PRINTCR$(CC); 1640 IF A$=CHR$(13) AND FQ(FC)=0 THEN FQ(FC)=SO:FO(SO)=FC:SO=SO+1:IF FR=2 THEN FR=1 1645 IF A$="" OR A$=CHR$(13) THEN FC=FC+1:IF FC>NF THEN FC=1 1650 IF A$="[145]" THEN FC=FC-1:IF FC<1 THEN FC=NF 1655 IF CT=1 AND ASC(A$+CHR$(0))=27 THEN A$="" 1657 IF A$="" THEN RETURN 1659 GOTO 1630 1660 REM MAKE USR FILE 1662 GOSUB5110:X=0:Y=24:GOSUB 2210:PRINT TX$(16);:L=1:Y=24:X=11:GOSUB 2320 1665 IF AN$="N" OR AN$="[206]" OR AN$="Y" OR AN$="[217]" THEN 1675 1667 GOTO 1660 1670 REM BUILD OUTPUT RECORDS 1675 GOSUB 6010 1680 REM SORT RECORDS 1685 IF AN$="Y" OR AN$="[217]" THEN GOSUB 7010 1690 REM OUTPUT EXPORT FILE 1691 IF C=4 THEN GOSUB 8310 1692 IF C=5 THEN GOSUB 8210 1695 IF C=6 THEN GOSUB 8010 1696 FOR T=1 TO NF 1697 FT$(T)=LEFT$(UL$,FL(T)):X=FX(T):Y=FY(T):GOSUB2210:PRINT CR$(CC);FT$(T); 1698 NEXT 1699 AN$="":RETURN 1700 REM EXIT PROGRAM 1710 IF OF=1 THEN 450 1720 IF CT=0 THEN POKE 808,237:GOTO1730 1721 (null) 1,"GRAPHIC":(null) 2,"DLOAD"+CHR$(34):(null) 3,"DIRECTORY"+CHR$(13) 1722 (null) 4,"SCNCLR"+CHR$(13):(null) 5,"DSAVE"+CHR$(34):(null) 6,"RUN"+CHR$(13) 1723 (null) 7,"LIST"+CHR$(13):(null) 8,"MONITOR"+CHR$(13) 1730 PRINT"[147][154]" 1740 END 1750 REM READ RECORD 1760 T8=FL(FC)-LEN(AN$):FT$(K1)=AN$+LEFT$(UL$,T8):KY$=AN$:GOSUB 2550 1770 IF KF<1 THEN 1830 1780 RP=1:GOSUB 5010:R$="":R1$="" 1790 FOR T=1 TO TL:GET#3,A$:R$=R$+A$:NEXT:GOSUB 5010 1800 A=1:FOR T=1 TO NF 1810 FT$(T)=MID$(R$,A,FL(T)):A=A+FL(T) 1815 X=FX(T):Y=FY(T):GOSUB2210:PRINT CR$(EC);FT$(T); 1820 NEXT 1830 RETURN 1840 REM READ PREV RECORD 1850 KF=KF-1:IF KF<1 THEN KF=IX(0) 1855 RN=IX(KF):IF RN=0 THEN KF=0 1860 GOTO 1770 1940 REM READ NEXT RECORD 1950 KF=KF+1:RN=IX(KF):IF RN=0 THEN KF=1:RN=IX(KF):IF RN=0 THEN KF=0 1960 GOTO 1770 2100 REM WRITE RECORD 2110 IF NR=MR THEN 2170 2120 KY$=FT$(K1):GOSUB 2550 2130 IF KF<1 THEN GOSUB 2710:NR=IX(0) 2140 RP=1:GOSUB5010 2150 R$="":R1$="":FOR T=1 TO NF:R$=R$+FT$(T) 2155 FT$(T)=LEFT$(UL$,FL(T)):X=FX(T):Y=FY(T):GOSUB2210:PRINT FT$(T); 2157 NEXT:GOSUB 5110 2158 AN$="Y":IF KF>0 THEN X=0:Y=24:GOSUB 2210:PRINT TX$(17);:X=22:L=1:GOSUB2320 2160 IF AN$="Y" OR AN$="[217]" THEN PRINT#3,R$; 2170 GOSUB 5010:RETURN 2200 REM CURSOR PLOT 2210 IF CT=0 THEN PRINT"";LEFT$(XP$,X);LEFT$(YP$,Y);:RETURN 2220 IF CT=1 THEN PRINT"";LEFT$(XP$,X);LEFT$(YP$,Y);:RETURN 2250 REM CURSOR READ 2260 IF CT=0 THEN X=PEEK(211):Y=PEEK(214) 2270 IF CT=1 THEN POKE 5,1:SYS 65520:Y=PEEK(7):X=PEEK(8) 2280 IF X>=SW THEN X=X-SW 2290 RETURN 2300 REM REQUESTOR EDITOR 2310 REM PASS X,Y,L=LENGTH RETURNS AN$ 2320 AN$="":GOSUB2210:PRINT""LEFT$(SP$,L)"[146]";:GOSUB2210 2330 GET A$:IF A$="" THEN 2330 2340 A=ASC(A$) 2350 IF CT=1 AND A=27 THEN A$="" 2360 IF A$="" THEN RETURN 2370 IFA<>13THEN2390 2380 GOSUB2200:PRINTAN$;LEFT$(SP$,(L+1)-LEN(AN$));:RETURN 2390 IFA=20ANDLEN(AN$)>0THENGOSUB2450 2400 IFA=147ANDLEN(AN$)>0THENGOSUB2450:GOTO2320 2410 IFA<31ORA>218THEN2330 2420 IFA>90ANDA<193THEN2330 2430 IFLEN(AN$)>=LTHEN2330 2440 PRINTA$;:AN$=AN$+A$:GOTO2330 2450 A$=" [146][157]":IFLEN(AN$)>=LTHENA$=" [157]" 2460 IF CT=0 THEN PRINTA$;"[157] [146][157]"; 2470 IF CT=1 THEN PRINT"[157] [146][157]"; 2480 AN$=LEFT$(AN$,LEN(AN$)-1):RETURN 2490 REM BINARY SEARCH 2500 REM PASS KY$=KEY STRING:KL=KEY LEN 2510 REM OS=OFFSET INTO RECORD FOR KEY 2520 REM RETURN KF=KEY FOUND 0=NO 1=YES 2530 REM -1=SEARCH ERROR 2540 REM RN=RECORD# IP=INSERT POSITION 2550 REM 2560 RS=1:RE=IX(0):KF=0:IP=0:IF RER$ THEN RS=RM+1:RM=INT((RE-RS)/2)+RS:GOTO 2580 2630 IF KY$MR THEN R1$="":RETURN 2650 RP=KP:GOSUB5010 2660 R1$="":FOR T=1 TO KL:GET#3,A$:R1$=R1$+A$:NEXT:RETURN 2670 KF=-1:RETURN:REM SEARCH ERROR 2680 REM INSERT KEY INTO INDEX 2690 REM IP=INSERT POSITION R$=RECORD STRING R1$=NEXT RECORD STRING 2700 REM KY$=KEY STRING RN=RECORD# 2710 IX(0)=IX(0)+1:IF IX(0)=1 THEN IP=1:GOTO 2760 2720 IF KY$NF THEN FC=1 2830 IF A$="[145]" THEN FC=FC-1:IF FC<1 THEN FC=NF 2840 IF CT=1 AND ASC(A$+CHR$(0))=27 THEN A$="" 2850 IF A$="" THEN 2880 2860 GOTO 2800 2870 REM REVIEW FORM & SET FIELD VARS 2880 GOSUB 5110:X=0:Y=24:GOSUB2210:PRINT TX$(9); 2890 ND=1:FC=0:AL=0:NM=0:SP=0:KY=0:FOR TY=1 TO NF 2900 X=0:Y=TY-1:GOSUB2210:PRINTFT$(TY); 2910 EF=0:IF RIGHT$(FT$(TY),1)=SS$ THEN EF=-1 2920 FT$(TY)=FT$(TY)+" ":IF EF=-1 THEN EF=0:GOTO 3190 2930 FOR TX=1 TO L+1 2940 A$=MID$(FT$(TY),TX,1) 2950 IF A$<>"[164]" THEN 3000 2960 IF ND=2 THEN 2980 2965 IF FC=MF THEN 3180 2970 FC=FC+1:ND=2:FL(FC)=0:FX(FC)=TX-1:FY(FC)=TY-1:X=TX-1:Y=TY-1:GOSUB2210 2980 FL(FC)=FL(FC)+1:PRINT"[164][146]"; 2990 GOTO 3180 3000 IF ND=1 THEN 3180 3010 ND=1:X=0:Y=24:GOSUB2210 3020 PRINT TX$(4)+" "+TX$(5)+" "+TX$(6)+" "+TX$(7)+" "+TX$(8); 3030 GET A$:IF A$="" THEN 3030 3040 IF CT=1 AND ASC(A$)=27 THEN A$="" 3050 IF A$="" THEN FT(FC)=AL+((KY AND 1)*2)+(NM*4)+(SP*8):AL=0:NM=0:SP=0:GOTO 3160 3060 IF A$="A" AND AL=0 THEN AL=1:X=6:GOSUB2210:PRINT""+TX$(5)+"[146]";:GOTO 3080 3070 IF A$="A" AND AL=1 THEN AL=0:X=6:GOSUB2210:PRINTTX$(5); 3080 IF A$="K" AND KY=0 THEN KY=1:X=12:GOSUB2210:PRINT""+TX$(6)+"[146]";:GOTO 3120 3090 IF A$="K" AND KY=1 THEN KY=0:X=12:GOSUB2210:PRINTTX$(6); 3100 IF A$="N" AND NM=0 THEN NM=1:X=16:GOSUB2210:PRINT""+TX$(7)+"[146]";:GOTO 3120 3110 IF A$="N" AND NM=1 THEN NM=0:X=16:GOSUB2210:PRINTTX$(7); 3120 IF A$="S" AND SP=0 THEN SP=1:X=20:GOSUB2210:PRINT""+TX$(8)+"[146]";:GOTO 3140 3130 IF A$="S" AND SP=1 THEN SP=0:X=20:GOSUB2210:PRINTTX$(8); 3140 REM 3150 GOTO 3030 3160 GOSUB 5110:X=0:Y=24:GOSUB2210:PRINT TX$(9); 3170 IF KY=1 THEN KY=2 3180 NEXT TX 3190 NEXT TY 3200 GOSUB 5110:IF KY=0 THEN FT(1)=FT(1)OR2 3210 REM WRITE FORM TO DISK 3220 OPEN 2,DN,2,DN$+".F,U,W" 3230 PRINT#2,"FORM";CHR$(VN);CHR$(SW);CHR$(NF); 3240 FOR T=1 TO NF:PRINT#2,FT$(T);:NEXT 3250 PRINT#2,CHR$(FC); 3260 FOR T=1 TO FC:PRINT#2,CHR$(FX(T));CHR$(FY(T));CHR$(FL(T));CHR$(FT(T)); 3270 NEXT 3280 CLOSE2 3290 RETURN 3300 REM READ FORM FROM DISK 3310 OPEN 2,DN,2,AN$+".F,U,R" 3320 GET#2,A$,A$,A$,A$:GET#2,A$:VN=ASC(A$+CHR$(0)) 3330 GET#2,A$:A=ASC(A$+CHR$(0)):IF SW=40 AND A=80 THEN CLOSE2:EF=-1:RETURN 3340 GET#2,A$:NL=ASC(A$+CHR$(0)) 3350 FOR T=1 TO NL:FT$(T)="":FOR T1=1 TO A:GET#2,A$:FT$(T)=FT$(T)+A$:NEXT 3355 FL$(T)=FT$(T):NEXT 3360 GET#2,A$:NF=ASC(A$+CHR$(0)) 3370 FOR T=1 TO NF:GET#2,A$:FX(T)=ASC(A$+CHR$(0)) 3380 GET#2,A$:FY(T)=ASC(A$+CHR$(0)):GET#2,A$:FL(T)=ASC(A$+CHR$(0)):TL=TL+FL(T) 3390 GET#2,A$:FT(T)=ASC(A$+CHR$(0)):NEXT 3400 CLOSE2:EF=0:RETURN 3410 REM FORM FIELD EDITOR 3420 REM PASS X,Y,L=LENGTH RETURNS AN$ 3430 GOSUB2210:PRINT""+LEFT$(AN$,L)+"[146]";:GOSUB2210:AN$="":OX=X:OY=Y 3440 GET A$:IF A$="" THEN 3440 3450 A=ASC(A$):IF A=F1 OR A=F2 THEN3460 3455 IF A>=F3 AND A<=F8 THEN 3480 3460 IF CT=1 AND A=27 THEN A$="" 3470 IF A$<>"" AND A$<>"[145]" AND A$<>""THEN 3490 3480 X=OX:Y=OY:AN$=FT$(FC):GOSUB2210:PRINTAN$;:TL=PL:RETURN 3490 IF A$="" AND ND<>0 AND TF0 THEN 3493 3492 GOTO 3500 3493 B$="":FOR T2=1 TO SW-1:A$=MID$(FT$(FC),T2,1):IF A$="[164]" THEN TL=TL-1 3494 IF A$<>"[164]" AND B$="[164]" THEN TF=TF-1 3495 B$=A$:NEXT:PL=TL:X=0:GOSUB2210:FT$(FC)=LEFT$(SP$,SW-1):AN$=FT$(FC) 3496 GOTO 3430 3500 IF A=F1 OR A=F2 THEN 3510 3505 IFA<>13THEN3550 3510 X=OX:Y=OY 3520 PL=TL:GOSUB2210 3530 IF CT=0 THEN PRINTAN$;LEFT$(PD$,L-LEN(AN$));:RETURN 3540 IF CT=1 THEN PRINTAN$;LEFT$(PD$,L-LEN(AN$));:RETURN 3550 IFA=20ANDLEN(AN$)>0THENGOSUB3670 3560 IF ND<>0 THEN 3630 3570 IF A=32 THEN 3650 3580 IF A=34 THEN 3440 3590 IF AL=1 THEN IF (A AND 127) > 64 AND (A AND 127) < 91 THEN GOTO 3650 3600 IF NM=1 THEN IF A>39 AND A<58 THEN 3650 3610 IF SP=1 THEN IF(A>31 AND A<48)OR(A>57 AND A<65)OR(A>90 AND A<96) THEN 3650 3620 GOTO 3440 3630 IFA<32ORA>218THEN3440 3640 IFA>95ANDA<193THEN3440 3650 IFLEN(AN$)>=LTHEN3440 3660 PRINTA$;:AN$=AN$+A$:GOTO3440 3670 IF MID$(AN$,LEN(AN$),1) = "[164]" THEN RETURN 3680 A$="":REM A$=" [146][157]":IFLEN(AN$)>=LTHENA$=" [157]" 3690 IF CT=0 THEN PRINTA$;"[157] [146][157]"; 3700 IF CT=1 THEN PRINT"[157] [146][157]"; 3710 AN$=LEFT$(AN$,LEN(AN$)-1):RETURN 3720 REM FIELD DEFINER 3730 ND=2:FL=0 3740 GOSUB2260:TX=X:TY=Y 3750 GOSUB 5110:X=0:Y=24:GOSUB2210:PRINT TX$(3);FL;TX$(11);TL; 3760 X=TX:Y=TY:GOSUB 2210 3770 GET A$:IF A$="" THEN 3770 3780 A=ASC(A$) 3790 IF A$<>"" THEN 3810 3795 IF FL>0 THEN TF=TF+1 3800 ND=1:TX=X:TY=Y:GOSUB 5110:X=TX:Y=TY:GOSUB 2210:RETURN 3810 IF A=20 AND FL>0 THEN GOSUB 3870 3820 IF A$<>" " THEN 3740 3830 IFLEN(AN$)>=LTHEN3770 3840 IF TL>253 THEN 3770 3850 IF MID$(FT$(FC),X+1,1)="[164]" THEN TL=TL-1 3860 A$="[164]":PRINT A$;:AN$=AN$+A$:FL=FL+1:TL=TL+1:GOTO3740 3870 FL=FL-1:TL=TL-1:A$=" [146][157]":IFLEN(AN$)>=LTHENA$=" [157]" 3880 IF CT=0 THEN PRINTA$;"[157] [146][157]"; 3890 IF CT=1 THEN PRINT"[157] [146][157]"; 3900 AN$=LEFT$(AN$,LEN(AN$)-1):RETURN 4000 REM CLEAR FIELDS 4010 FOR T=1 TO NF 4020 FT$(T)=LEFT$(UL$,FL(T)):X=FX(T):Y=FY(T):GOSUB2210:PRINT FT$(T);:NEXT 4030 RETURN 4050 REM PRINT FIELDS 4060 OPEN4,4,7 4065 H2=1:FOR H=1 TO NL 4070 FOR H1=1 TO LEN(FL$(H)):A$=MID$(FL$(H),H1,1) 4080 IF A$<>"[164]" THEN PRINT#4,A$;:GOTO 4100 4082 FOR H3=1 TO FL(H2):A$=MID$(FT$(H2),H3,1) 4083 IF A$="[164]" THEN A$=" " 4085 PRINT#4,A$;:NEXT:H2=H2+1 4090 H1=H1+1:A$=MID$(FL$(H),H1,1):IF A$="[164]" THEN 4090 4095 H1=H1-1 4100 NEXT 4105 PRINT#4,CHR$(13);:NEXT 4110 CLOSE4:RETURN 4200 REM UTILS SUB MENU 4210 X=0:Y=23:GOSUB 2210:PRINTLEFT$(SP$,SW); 4215 X=0:Y=24:GOSUB 2210:PRINTLEFT$(SP$,SW-1); 4220 X=0:Y=23:GOSUB 2210:PRINT SM$; 4230 C=1 4235 X=SX(C):Y=SY(C):GOSUB 2210:PRINT""CR$(HC);SM$(C);"[146]"; 4240 GETA$:IFA$=""THEN4240 4245 X=SX(C):Y=SY(C):GOSUB2210:PRINTCR$(CC);SM$(C); 4250 IF A$=CHR$(13) THEN4300 4255 IF A$="" THEN 4270 4260 IF A$="[157]" THEN 4280 4261 IF CT=1 AND A$=CHR$(27) THEN A$="" 4262 IF A$="" THEN RETURN 4265 GOTO 4235 4270 C=C+1:IF C>NS THEN C=1 4275 GOTO 4235 4280 C=C-1:IF C<1 THEN C=NS 4285 GOTO 4235 4300 ON C GOTO 4410,4510,4610,4710,4810,4810 4305 GOTO 4235 4400 REM DIR 4410 IF CT=0 THEN 4460 4420 PRINT"[147]":(null) U(DN) 4422 PRINT"[208]RESS [210][197][212][213][210][206] TO CONTINUE" 4423 GETA$:IF A$<>CHR$(13) THEN 4423 4424 PRINT"[147]"; 4430 FOR T=1 TO NL:PRINT FL$(T):NEXT 4431 X=0:Y=22:GOSUB2210 4432 PRINTCR$(EC);:FOR T=1 TO SW:PRINT"[192]";:NEXT:X=0:GOSUB2210:PRINTTX$(1); 4440 GOTO 4215 4450 REM C64 DIR 4460 PRINT"[147]":GOSUB 10000 4490 GOTO 4422 4500 REM DOS 4510 X=0:Y=24:L=30:GOSUB2320:IF A$="" THEN GOTO 4210 4520 OPEN 1,DN,15,AN$:CLOSE1:GOSUB 5060 4530 GOTO 4215 4600 REM DRIVE# 4610 X=0:Y=24:L=2:GOSUB 2320:A=VAL(AN$):IF A>7 AND A<12 THEN DN=A 4615 A$="[196]RIVE#":B$="":IF DN<10 THEN B$="0" 4616 B$=B$+MID$(STR$(DN),2) 4620 SM$(C)=A$+B$ 4630 A$=SM$:SM$=LEFT$(A$,23)+B$+MID$(A$,26) 4650 GOTO 4215 4700 REM PRINT 4710 RT=0:GOSUB 5110:X=0:Y=24:GOSUB 2210:PRINT"[210]EPORT OR [204]ABELS ? (R/L)"; 4711 X=26:Y=24:L=1:GOSUB 2320 4712 IF AN$="R" THEN RT=1 4713 IF AN$="L" THEN RT=2 4715 IF RT=0 THEN 4710 4719 GOSUB 1615:IF OF=0 THEN 4215 4720 GOSUB 1662:GOTO 4215 4800 REM SEQ,USR 4810 GOSUB 1615:IF OF=0 THEN 4215 4820 GOSUB 1662:GOTO 4215 5000 REM POSITION TO RECORD# 5010 RH=FNH(RN):RL=FNL(RN) 5020 PRINT#1,"P"CHR$(96+3)CHR$(RL)CHR$(RH)CHR$(RP) 5030 PRINT#1,"P"CHR$(96+3)CHR$(RL)CHR$(RH)CHR$(RP) 5040 RETURN 5050 REM GENERAL DISK ERROR ALERT 5060 GOSUB 5110:X=0:Y=24:GOSUB2210:PRINT EN;" ";ER$;TR;SC;" [208]RESS [210][197][212][213][210][206]"; 5070 GET A$:IF A$="" THEN 5070 5080 IF A$<>CHR$(13) THEN 5070 5090 CLOSE1:CLOSE2:CLOSE3:RETURN 5100 REM CLEAR STATUS LINE 5110 X=0:Y=24:GOSUB2210:PRINT LEFT$(SP$,SW-1);:RETURN 5120 X=0:Y=23:GOSUB2210:PRINT LEFT$(SP$,SW-1);:RETURN 5130 REM DISK STATUS READER 5140 OPEN1,DN,15 5145 INPUT#1,EN,ER$,TR,SC:CLOSE1 5150 RETURN 5200 GOSUB2210:PRINT""+LEFT$(AN$,L)+"[146]"; 5210 GET A$:IF A$="" THEN 5210 5220 A=ASC(A$) 5230 IF CT=1 AND A=27 THEN A$="" 5240 IF A$<>"" AND A$<>"[145]" AND A$<>"" AND A$<>CHR$(13) THEN 5210 5250 IF A$=CHR$(13) THEN RETURN 5255 IF FQ(FC)<>0 THEN RETURN 5260 GOSUB2210:PRINTCR$(CC);LEFT$(AN$,L);:RETURN 5300 REM FIND RECORD 5310 FR=2:GOSUB 5110:GOSUB 1615:FC=FO(1):FR=0:IF FC=0 THEN RETURN 5315 GOSUB5120:GOSUB 2210:PRINT "[197]NTER SEARCH STRING"; 5320 L=FL(FC):X=0:Y=24:GOSUB 2320 5330 IF FT(FC) AND 2 THEN GOSUB 1760:GOSUB 5120:RETURN 5350 T1=1:T2=1:T5=LEN(AN$) 5360 IF T1=FC THEN 5400 5370 T2=T2+FL(T1):T1=T1+1:GOTO 5360 5400 T4=FL(FC):RN=0 5405 RN=RN+1:IF RN>IX(0) THEN GOSUB5120:RETURN 5410 RP=T2:GOSUB 5010:ZZ$="" 5420 FOR T3=1 TO T4:GET#3,A$:ZZ$=ZZ$+A$:NEXT 5430 IF LEFT$(ZZ$,T5)=AN$ THEN 5440 5432 GET A$ 5434 IF CT=1 AND ASC(A$+CHR$(0))=27 THEN A$="" 5435 IF A$="" THEN GOSUB 5120:RETURN 5437 GOTO 5405 5440 GOSUB 1780:GOSUB 5120 5445 X=0:Y=23:GOSUB 2210:PRINT "[210][197][212][213][210][206] - NEXT REC [197][211][195] OR [211][212][207][208] - EXIT"; 5450 GET A$:IF A$="" THEN 5450 5460 IF ASC(A$)=27 THEN A$="" 5470 IF A$="" THEN GOSUB 5120:RETURN 5475 IF A$=CHR$(F8) THEN GOSUB 4060:GOTO 5450 5480 IF ASC(A$)=13 THEN 5405 5490 GOTO 5450 6000 REM BUILD OUTPUT RECORDS 6010 OPEN1,DN,15:OPEN3,DN,3,DN$+".D":T1=1 6020 IF T1>IX(0) THEN 6990 6030 RN=IX(T1):RP=1:GOSUB 5010:R$="":R1$="" 6040 FOR T=1 TO TL:GET#3,A$:R$=R$+A$:NEXT:GOSUB 5010 6050 A=1:FOR T=1 TO NF 6060 FT$(T)=MID$(R$,A,FL(T)):A=A+FL(T) 6070 NEXT 6100 R$="" 6110 FOR T=1 TO SO-1 6120 R$=R$+FT$(FO(T)) 6130 NEXT 6140 RD$(T1)=R$:SI(T1)=T1:T1=T1+1:GOTO 6020 6990 T1=T1-1:CLOSE3:CLOSE1:RETURN 7000 REM SORT OUTPUT RECORDS 7010 FOR J=1 TO T1-1 7020 FOR K=J+1 TO T1 7030 IF RD$(SI(J)) > RD$(SI(K)) THEN TE=SI(J):SI(J)=SI(K):SI(K)=TE 7040 NEXT K 7050 NEXT J 7990 RETURN 8000 REM WRITE OUTPUT RECORDS TO USR FILE 8010 OPEN1,DN,15:OPEN2,DN,2,DN$+".U,U,W":INPUT#1,EN,ER$,TR,SC 8012 IF EN<>63 THEN 8020 8014 X=0:Y=24:GOSUB 2210:PRINT"[210]EPLACE FILE (Y/N)"; 8015 X=19:L=1:GOSUB 2320 8016 IF AN$="Y" OR AN$="[217]" THEN PRINT#1,"S:"+DN$+".U":CLOSE2:CLOSE1:GOTO 8010 8020 IF EN<>0 THEN CLOSE2:CLOSE1:GOSUB 5060:RETURN 8025 RH=FNH(T1):RL=FNL(T1) 8027 PRINT#2,"QURY"; 8031 PRINT#2,CHR$(VN);CHR$(RL);CHR$(RH); 8040 PRINT#2,CHR$(SO-1);:FOR T=1 TO SO-1:PRINT#2,CHR$(FL(FO(T)));:NEXT 8050 FOR T=1 TO T1:PRINT#2,RD$(SI(T));:NEXT 8100 CLOSE2:CLOSE1 8110 RETURN 8200 REM WRITE OUTPUT RECORDS TO SEQ FILE 8210 OPEN1,DN,15:OPEN2,DN,2,DN$+".S,S,W":INPUT#1,EN,ER$,TR,SC 8212 IF EN<>63 THEN 8220 8214 X=0:Y=24:GOSUB 2210:PRINT"[210]EPLACE FILE (Y/N)"; 8215 X=19:L=1:GOSUB 2320 8216 IF AN$="Y" OR AN$="[217]" THEN PRINT#1,"S:"+DN$+".S":CLOSE2:CLOSE1:GOTO 8210 8220 IF EN<>0 THEN CLOSE2:CLOSE1:GOSUB 5060:RETURN 8250 FOR T=1 TO T1:T5=1 8252 FOR T4=1 TO SO-1:T7=FL(FO(T4)) 8254 FOR T8=0 TO T7-1 8255 A$=MID$(RD$(SI(T)),T5+T8,1):IF A$="[164]" THEN A$=" " 8257 PRINT#2,A$;:NEXT:T5=T5+T7:PRINT#2 8259 NEXT:PRINT#2:NEXT 8260 CLOSE2:CLOSE1 8270 RETURN 8300 REM WRITE OUTPUT RECORDS TO PRINTER 8310 IF RT=2 THEN 8410 8320 OPEN4,4,7 8350 FOR T=1 TO T1:T5=1:T6=1 8352 FOR T4=1 TO SO-1:T7=FL(FO(T4)):IF T6+T7>79 THEN PRINT#4:T6=1 8354 FOR T8=0 TO T7-1 8355 A$=MID$(RD$(SI(T)),T5+T8,1):IF A$="[164]" THEN A$=" " 8357 PRINT#4,A$;:NEXT:T5=T5+T7:T6=T6+T7+1:PRINT#4," "; 8358 NEXT:PRINT#4:NEXT 8360 CLOSE4 8370 RETURN 8400 REM WRITE OUTPUT RECORDS TO LABELS ON PRINTER 8410 OPEN4,4,7 8450 FOR T=1 TO T1:T6=0:T5=FY(FO(1)):T9=1 8452 FOR T4=1 TO SO-1:T7=FL(FO(T4)):IF T5<>FY(FO(T4)) THEN PRINT#4:T6=T6+1 8453 T5=FY(FO(T4)) 8454 FOR T8=0 TO T7-1 8455 A$=MID$(RD$(SI(T)),T9+T8,1):IF A$="[164]" THEN A$=" " 8457 PRINT#4,A$;:NEXT:PRINT#4," ";:T9=T9+T7 8458 NEXT 8459 IF T6<7 THEN PRINT#4:T6=T6+1:GOTO 8459 8460 NEXT:CLOSE4 8990 RETURN 10000 OPEN1,DN,0,"$" 10010 GET#1,A$,A$:T=2 10020 GET#1,A$:IF ST<>0 THEN 10060 10030 GET#1,A$,A$,B$:A=ASC(B$+CHR$(0))*256+ASC(A$+CHR$(0)):PRINTA;:T=T+4 10040 GET#1,A$:PRINTA$;:T=T+1 10042 GETC$:IF C$<>" " THEN 10045 10043 POKE 198,0 10044 GETC$:IF C$<>" " THEN 10044 10045 IF T<32 THEN 10040 10050 T=0:PRINT"[146]":GOTO 10020 10060 CLOSE1 10160 RETURN 20000 OPEN1,8,15,"S0:RUNFILE":CLOSE1 20010 SAVE"RUNFILE",8 20020 END 21000 REM RESUME